#ifndef MY_SHMTX_H
#define MY_SHMTX_H 1


#include <config.h>
#include <core.h>


typedef struct {
    msgd_atomic_t   lock;
    msgd_atomic_t   wait;
} msgd_shmtx_sh_t;


typedef struct {
    msgd_atomic_t  *lock;
    msgd_atomic_t  *wait;
    msgd_uint_t     semaphore;
    sem_t           sem;
    msgd_uint_t     spin;
} msgd_shmtx_t;


msgd_int_t msgd_shmtx_create(msgd_shmtx_t *mtx, msgd_shmtx_sh_t *addr);
void msgd_shmtx_destory(msgd_shmtx_t *mtx);
msgd_uint_t msgd_shmtx_trylock(msgd_shmtx_t *mtx);
void msgd_shmtx_lock(msgd_shmtx_t *mtx);
void msgd_shmtx_unlock(msgd_shmtx_t *mtx);
msgd_uint_t msgd_shmtx_force_unlock(msgd_shmtx_t *mtx, pid_t pid);


#endif /* MY_SHMTX_H */
